home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 July / EnigmA AMIGA RUN 29 (1998)(G.R. Edizioni)(IT)[!][issue 1998-07 & 08].iso / earkit / news / thor / hd-install / thor.lha / rexx / Local2Email.br < prev    next >
Text File  |  1997-08-20  |  9KB  |  326 lines

  1. /*
  2. ** $VER: Local2Email.br 1.55 (13.6.97)
  3. ** by Eirik Nicolai Synnes
  4. **
  5. ** Based on ML2Email.thor by Remco van Hooff
  6. **
  7. ** See SortMail.guide for documentation
  8. **
  9. */
  10.  
  11. options results
  12.  
  13. parse arg arguments
  14.  
  15. /*
  16. ** Initialize some variables
  17. */
  18.  
  19. template = 'SYSTEM/A'
  20.  
  21. fromthor = 0; cfgread = 0
  22.  
  23. EVE_ENTERMSG       =  0  /* Enter message */
  24. EVE_REPLYMSG       =  1  /* Reply message */
  25. EVE_FORWARDMSG     =  9  /* Forward message (only for TCP/SOUP) */
  26.  
  27. EDB_DELETED        =  0  /* Event is deleted */
  28. EDB_PACKED         =  1  /* Event is packed */
  29. EDB_DONE           =  2  /* Event is done */
  30. EDB_ERROR          =  3  /* Error performing this event */
  31. EDB_UNRECOVERABLE  =  4  /* Event can not be undeleted */
  32. EDB_FREEZE         =  5  /* Event is frozen. Will not be done as long as this flag is set. */
  33.  
  34. CDB_MAIL           =  1  /* Private mail conference. */
  35. CDB_NOT_ON_BBS     = 15  /* This conference is not on the bbs. */
  36.  
  37. UDB_DELETED        =  0  /* User is deleted */
  38. UDB_UNRECOVERABLE  =  1  /* User can not be undeleted */
  39.  
  40. BDB_EVENTS_CHANGED =  5  /* Events changed after last event package was made. */
  41.  
  42. /*
  43. ** Find/open Thor ARexx port
  44. */
  45.  
  46. /* See if I'm run from Thor */
  47.  
  48. if left(address(), 5) = 'THOR.' then do
  49.     thorport = address()
  50.     address(thorport)
  51.     'CURRENTSYSTEM STEM 'cursys
  52.     if rc ~= 0 then do
  53.         say 'CURRENTSYSTEM: 'THOR.LASTERROR
  54.         exit(rc)
  55.         end
  56.     else fromthor = 1
  57.     end
  58.  
  59. /*
  60. ** Find/open BBSREAD ARexx port
  61. */
  62.  
  63. if ~show('P', 'BBSREAD') then do
  64.     address(command)
  65.     'Run >NIL: `GetEnv THOR/THORPath`bin/LoadBBSRead'
  66.     if exists('SYS:RexxC/WaitForPort') then 'SYS:RexxC/WaitForPort BBSREAD'
  67.     else 'WaitForPort BBSREAD'
  68.     if (rc = 5) then do; myerr = 'Couldn''t open BBSREAD''s ARexx port.'; rc = 30; signal error; end
  69.     if (rc ~= 0) then do; myerr = 'Could not find SYS:Rexxc/WaitForPort.'; rc = 30; signal error; end
  70.     end
  71.  
  72. /*
  73. ** Parse arguments
  74. */
  75.  
  76. address(bbsread)
  77.  
  78. if ~fromthor then do
  79.     if arguments = '?' | arguments = '' then do
  80.         say 'Usage: 'template
  81.         exit(0)
  82.         end
  83.     'READARGS 'template args' CMDLINE 'arguments
  84.     if rc ~= 0 then do
  85.         say 'READARGS: 'BBSREAD.LASTERROR
  86.         exit(rc)
  87.         end
  88.     cursys.BBSNAME = args.SYSTEM
  89.     end
  90.  
  91. /*
  92. ** Get system info
  93. */
  94.  
  95.  
  96. 'GETBBSDATA BBSNAME "'cursys.BBSNAME'" STEM 'bbsdata
  97. if rc ~= 0 then do
  98.     say 'GETBBSDATA: 'BBSREAD.LASTERROR
  99.     exit(rc)
  100.     end
  101. if (right(bbsdata.BBSPATH, 1) ~= ':') & (right(bbsdata.BBSPATH, 1) ~= '/') then bbsdata.BBSPATH = bbsdata.BBSPATH || '/'
  102.  
  103. /*
  104. ** Leave if there are no active changed events
  105. */
  106.  
  107. if (bbsdata.NUMEVENTS = 0) | ~bittst(bbsdata.FLAGS, BDB_EVENTS_CHANGED) then exit(0)
  108.  
  109. /*
  110. ** Find name of email conference
  111. */
  112.  
  113. 'GETCONFLIST BBSNAME "'cursys.BBSNAME'" STEM 'conflist
  114. if rc ~= 0 then do
  115.     say 'GETCONFLIST: 'BBSREAD.LASTERROR
  116.     exit(rc)
  117.     end
  118.  
  119. mailcount = 0
  120. do i = 1 to conflist.COUNT
  121.     'GETCONFDATA "'cursys.BBSNAME'" "'conflist.i'" 'confdata
  122.     if rc ~= 0 then do
  123.         say 'GETCONFDATA: 'BBSREAD.LASTERROR
  124.         exit(rc)
  125.         end
  126.     if bittst(confdata.FLAGS, CDB_MAIL) then do
  127.         email = confdata.NAME; mailcount = mailcount + 1
  128.         end
  129.     end
  130.  
  131. if symbol('email') ~= 'VAR' then do
  132.     say 'Couldn''t find Email conference'
  133.     exit(20)
  134.     end
  135.  
  136. if mailcount > 1 then email = readcfg(1)
  137.  
  138. /*
  139. ** Main loop
  140. */
  141.  
  142. do n = bbsdata.FIRSTEVENT to bbsdata.LASTEVENT
  143.     drop eventtags. eventdata.
  144.  
  145.     changed = 0; crosspost = 0
  146.  
  147.     /* Read event data */
  148.  
  149.     'READBREVENT "'cursys.BBSNAME'" EVENTNR 'n' DATASTEM 'eventdata' TAGSSTEM 'eventtags
  150.     if rc ~= 0 then do
  151.         say 'READBREVENT: 'BBSREAD.LASTERROR
  152.         exit(rc)
  153.         end
  154.  
  155.     /* Skip event if it is not a reply/enter or it is deleted, packed, etc. */
  156.  
  157.     if ~(eventdata.EVENTTYPE = EVE_ENTERMSG | eventdata.EVENTTYPE = EVE_REPLYMSG | eventdata.EVENTTYPE = EVE_FORWARDMSG) then iterate n
  158.     if bittst(eventdata.FLAGS, EDB_DELETED) | bittst(eventdata.FLAGS, EDB_PACKED) | bittst(eventdata.FLAGS, EDB_DONE) | bittst(eventdata.FLAGS, EDB_ERROR) | bittst(eventdata.FLAGS, EDB_UNRECOVERABLE) | bittst(eventdata.FLAGS, EDB_FREEZE) then iterate n
  159.  
  160.     /* Split conferences and to-addresses into stems */
  161.  
  162.     if index(eventtags.CONFERENCE, ',') > 0 then do
  163.         crosspost = 1; confs = eventtags.CONFERENCE; ccnt = 0
  164.         do while index(confs, ',') > 0
  165.             ccnt = ccnt + 1; confs.ccnt = left(confs, (index(confs, ',') - 1))
  166.             confs = substr(confs, index(confs, ',') + 1)
  167.             end
  168.         ccnt = ccnt + 1; confs.ccnt = confs; confs.count = ccnt; drop confs ccnt
  169.         end
  170.     else do; confs.count = 1; confs.1 = eventtags.CONFERENCE; end
  171.  
  172.     if index(eventtags.TOADDR, ',') > 0 then do
  173.         toaddrs = eventtags.TOADDR; acnt = 0
  174.         do while index(toaddrs, ',') > 0
  175.             acnt = acnt + 1; toaddrs.acnt = left(toaddrs, (index(toaddrs, ',') - 1))
  176.             toaddrs = substr(toaddrs, index(toaddrs, ',') + 1)
  177.             end
  178.         acnt = acnt + 1; toaddrs.acnt = toaddrs; toaddrs.count = acnt; drop toaddrs acnt
  179.         end
  180.     else do; toaddrs.count = 1; toaddrs.1 = eventtags.TOADDR; end
  181.  
  182.     /* Replace local conferences with email conference and add reply address */
  183.  
  184.     do i = 1 to confs.count
  185.         drop confdata.; unknown = 0
  186.         'GETCONFDATA "'cursys.BBSNAME'" "'confs.i'" 'confdata
  187.         if rc ~= 0 then do
  188.             if BBSREAD.LASTERROR = 'Unknown conference' then unknown = 1
  189.             else do
  190.                 say 'GETCONFDATA: 'BBSREAD.LASTERROR
  191.                 exit(rc)
  192.                 end
  193.             end
  194.  
  195.         if (~unknown) & (bittst(confdata.FLAGS, CDB_NOT_ON_BBS)) then do
  196.             if cfgread = 0 then call readcfg(0); addradd = 0
  197.  
  198.             if trig.count > 0 then do m = 1 to trig.count
  199.                 if upper(trig.m.conf) = upper(confs.i) then do
  200.                     match = 0
  201.                     do j = 1 to toaddrs.count
  202.                         if upper(toaddrs.j) = upper(trig.m.addr) then match = 1
  203.                         end
  204.                     if ~match then do
  205.                         acnt = toaddrs.count + 1; toaddrs.acnt = trig.m.addr; toaddrs.count = acnt; addradd = 1
  206.                         end
  207.                     end
  208.                 end
  209.  
  210.             if (addradd | confs.i ~= email) then confs.i = email
  211.             changed = 1
  212.             end
  213.         end
  214.  
  215.     /* Recreate conference and to-address strings */
  216.  
  217.     eventtags.CONFERENCE = ''; mailfound = 0
  218.     do i = 1 to confs.count
  219.         if (upper(confs.i) ~= upper(email)) | (~mailfound) then eventtags.CONFERENCE = eventtags.CONFERENCE || confs.i || ','
  220.         if (~mailfound) & (upper(confs.i) = upper(email)) then mailfound = 1
  221.         end
  222.     eventtags.CONFERENCE = strip(eventtags.CONFERENCE, 'B', ',')
  223.  
  224.     eventtags.TOADDR = ''
  225.     do i = 1 to toaddrs.count
  226.         eventtags.TOADDR = eventtags.TOADDR || toaddrs.i || ','
  227.         end
  228.     eventtags.TOADDR = strip(eventtags.TOADDR, 'B', ',')
  229.  
  230.     /* Replace names with corresponding address(es) */
  231.  
  232.     if (~crosspost) & (symbol('eventtags.TOADDR') = 'VAR') & (strip(eventtags.TOADDR, 'B') ~= '') & (length(eventtags.TOADDR) = length(compress(eventtags.TOADDR, '@#?*()|'))) then do
  233.         drop user.
  234.         'SEARCHBRUSER "'cursys.BBSNAME'" STEM 'user' SEARCH "'addasterix(eventtags.TOADDR)'" NAME'
  235.         if rc ~= 0 then do
  236.             say 'SEARCHBRUSER: 'BBSREAD.LASTERROR
  237.             exit(rc)
  238.             end
  239.         if result > 0 then do
  240.             drop usertags. userdata.
  241.             'READBRUSER BBSNAME "'cursys.BBSNAME'" USERNR 'user.1.USERNR' TAGSSTEM 'usertags' DATASTEM 'userdata
  242.             if rc ~= 0 then do
  243.                 say 'READBRUSER: 'BBSREAD.LASTERROR
  244.                 exit(rc)
  245.                 end
  246.             if ~bittst(userdata.FLAGS, UDB_DELETED) & ~bittst(userdata.FLAGS, UDB_UNRECOVERABLE) then do
  247.                 eventtags.TOADDR = usertags.ADDRESS; changed = 1
  248.                 end
  249.             end
  250.         end
  251.  
  252.     if changed then do
  253.         'WRITEBREVENT BBSNAME "'cursys.BBSNAME'" EVENT 'eventdata.EVENTTYPE' STEM 'eventtags 'UPDATEEVENTNR 'n
  254.         if rc ~= 0 then do
  255.             say 'READBRUSER: 'BBSREAD.LASTERROR
  256.             exit(rc)
  257.             end
  258.         end
  259.     end
  260.  
  261. exit(0)
  262.  
  263. /*
  264. ** Procedures
  265. */
  266.  
  267. readcfg: procedure expose cfgread trig. bbsdata.
  268.          parse arg email
  269.  
  270. foundcfg = 0; trigcnt = 0
  271.  
  272. cfgpath = bbsdata.BBSPATH
  273. cfgfile = 'SortMail.cfg'
  274.  
  275. if (right(cfgpath, 1) ~= '/') & (right(cfgpath, 1) ~= ':') then cfgpath = cfgpath || '/'
  276.  
  277. if ~exists(cfgpath || cfgfile) then do
  278.     say 'Couldn''t find SortMail.cfg'
  279.     exit(30)
  280.     end
  281.  
  282. cfgopen = open(cf, cfgpath || cfgfile, 'R')
  283.  
  284. address(bbsread)
  285.  
  286. if cfgopen then do until eof(cf)
  287.     entry = readln(cf)
  288.     if ~email & upper(subword(entry, 1, 1)) = 'ACTION' then do
  289.         'READARGS TEMPLATE "TYPE/A,DESTSYS/K,DESTCONF/K,REPLYADDR/K,SCRIPTNAME/K,SCRIPTOPTS/K,FILENAME/K,DIRECTORY/K,SUBSTITUTE/K,WITH/K,HEADER/S,APPEND/S,NOBIN/S,CHECKDUPES/S,DONTADD/S,NOSTATS/S,SUBJECT/K,SENDTO/K,TEXTFILE/K" STEM 'trigentry' CMDLINE 'subword(entry, 2)
  290.         if rc ~= 0 then do; say 'READARGS: 'BBSREAD.LASTERROR; exit(rc); end
  291.         if (upper(trigentry.TYPE) = 'COPY' | upper(trigentry.TYPE) = 'SPLITDIGEST') & symbol('trigentry.REPLYADDR') = 'VAR' then do
  292.             trigcnt = trigcnt + 1; trig.trigcnt.conf = trigentry.DESTCONF; trig.trigcnt.addr = trigentry.REPLYADDR
  293.             end
  294.         trig.count = trigcnt; drop trigentry.
  295.         end
  296.     if email & upper(subword(entry, 1, 1)) = 'GLOBAL' then do
  297.         'READARGS TEMPLATE "SYSTEM/K,CONFERENCE/A,STATISTICS/S,NOWARN/S,LOGINSTATE/S" STEM 'trigentry' CMDLINE 'subword(entry, 2)
  298.         if rc ~= 0 then do; say 'READARGS: 'BBSREAD.LASTERROR; exit(rc); end
  299.         call close(cf)
  300.         return(trigentry.CONFERENCE)
  301.         end
  302.     end
  303.  
  304. cfgread = 1
  305.  
  306. call close(cf)
  307.  
  308. return(0)
  309.  
  310.  
  311. addasterix: interpret 'procedure expose 'globals
  312.             parse arg str
  313.  
  314. if str = '' then return(str)
  315.  
  316. lastfound = 0; found = index(str, '"')
  317. do while found > lastfound
  318.     secondpart = substr(str, found + length('"'))
  319.     firstpart = substr(str, 1, length(str) - length(substr(str, found)))
  320.     str = firstpart || '*"' || secondpart
  321.     lastfound = found + length('*"')
  322.     found = index(str, '"', lastfound)
  323.     end
  324.  
  325. return(str)
  326.